package com.baidu.service;

import com.baidu.entity.Sked;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;

/**
 * @Author lvchong
 * @Description: 修改
 * @Date: Created in 2021/12/14 14:13
 * @Modified By:
 */
public class Dengx {
    /**
     * @param principal 本金
     * @param rateForYear 年利率
     * @param month 还款月数
     */
    public static ArrayList calculate(BigDecimal principal, BigDecimal rateForYear, Integer month) {
        DecimalFormat format = new DecimalFormat("#0.00");

        // 计算月利率
        BigDecimal rate = rateForYear.divide(BigDecimal.valueOf(12), 6, RoundingMode.HALF_UP);

        // （1 + 月利率）
        BigDecimal oneAddRate = rate.add(BigDecimal.ONE);

        // 月利率 ×（1 + 月利率）^ 还款月数
        BigDecimal factor0 = oneAddRate.pow(month).multiply(rate);

        // (1 + 月利率) ^ 还款月数
        BigDecimal factor1 = oneAddRate.pow(month);

        // (1 + 月利率) ^ 还款月数 - 1
        BigDecimal factor2 = factor1.subtract(BigDecimal.ONE);

        ArrayList<Sked> list = new ArrayList();
        for(int i = 1; i <= month; i++) {
            Sked sked = new Sked();
            // ( 1 + 月利率) ^ (还款月序号 - 1)
            BigDecimal factor3 = oneAddRate.pow(i - 1);

            // 计算每月还款利息
            BigDecimal monthlyInterest = principal.multiply(rate).multiply(factor1.subtract(factor3)).divide(factor2, 2, RoundingMode.HALF_UP);
            //1 System.out.print("第" + i + "月利息: " + monthlyInterest + ",\t\t");
            sked.setWvs(i);
            sked.setInterest(monthlyInterest.doubleValue());
            // 计算每月还款本金
            BigDecimal monthlyPrinciple = principal.multiply(rate).multiply(factor3).divide(factor2, 2, RoundingMode.HALF_UP);
            //1 System.out.print("第" + i + "月本金: " + monthlyPrinciple + "\t\t");
            sked.setPrincipal(monthlyPrinciple.doubleValue());
            //1 System.out.println("合计: " + monthlyInterest + " + " + monthlyPrinciple + "=" + (monthlyInterest.add(monthlyPrinciple)));
            sked.setNums(monthlyInterest.add(monthlyPrinciple).doubleValue());
            list.add(sked);
        }

        // 计算每月还款额, 可以用 monthlyInterest + monthlyPrinciple 获得
        // BigDecimal monthly = monthlyInterest + monthlyPrinciple
        // 每月还款额, 如果业务不需要计算 monthlyInterest 和 monthlyPrinciple, 也可以通过这个公式直接计算
        BigDecimal monthly = principal.multiply(factor0).divide(factor2, 2, RoundingMode.HALF_UP);

        // 本息总和 TODO 经测试, 每月还款金额和网上的计算器结果一样, 但是本息总和有误差 (少了0.5)
        BigDecimal all = monthly.multiply(BigDecimal.valueOf(month));

        // 总利息
        BigDecimal sumInterest = all.subtract(principal);
        //1 System.out.println("总利息: " + format.format(sumInterest));

        //1 System.out.println("总还款额: " + all);
        return list;
    }
}
